<?php
// +----------------------------------------------------------------------
// | Table前置构建 v1.2.2
// +----------------------------------------------------------------------
declare (strict_types=1);

namespace app\common\builder;

use think\facade\Cache;

class TableFront
{

    private $table = [];

    private $search = [];

    private static $instance;

    /**
     * @return TableFront
     * 原点 2022年8月3日11:25:32 定义单例模式
     */
    public static function getInstance()
    {
        if (is_null(self::$instance)) {
            self::$instance = new self();
        }
        return self::$instance;
    }

    /**
     * @param $table
     * @return $this
     * 原点 2022年8月3日11:24:52 设置table一行内容
     */
    public function addRow($table)
    {
        if ($table && is_array($table)) {
            $this->table[] = $table;
        }
        return $this;
    }

    /**
     * @param $table
     * @return $this
     * 原点 2022年8月3日11:24:52 批量设置table多行内容
     */
    public function addBatchRows($tables)
    {
        if ($tables && is_array($tables)) {
            foreach ($tables as $v) {
                $this->table[] = $v;
            }
        }
        return $this;
    }

    /**
     * @param $name
     * @param $cache
     * @return array|mixed
     * 原点 2022年8月3日11:23:48 获取table所有内容
     */
    public function getTable($name = '', $cache = true)
    {

        $name = TableTool::getName($name, 'table');
        if ($cache) {
            if (Cache::get($name)) {
                return Cache::get($name);
            } else {
                Cache::set($name, $this->table);
                return $this->table;
            }
        } else {
            return $this->table;
        }
    }

    /**
     * @param $name
     * @return $this
     * 原点 2022年11月5日13:57:22 清除缓存
     */
    public function clearTable($name = '')
    {
        Cache::delete(TableTool::getName($name, 'table'));
        return $this;
    }

    /**
     * @param $name
     * @param $modify
     * @return array
     * 原点 2022年8月3日11:22:35 获取table的field值。也就是key值
     */
    public function getFieldTable($name)
    {
        $data = Cache::get(TableTool::getName($name, 'table'));
        if (!$data) {
            return [];
        }
        foreach ($data as $k => $v) {
            if (isset($v['field'])) {
                $title[$v['field']] = $v['title'];
            }
        }
        return $title;
    }

    /**
     * @param $name
     * @param $modify
     * @return array
     * 原点 2022年8月3日11:22:35 获取table可编辑的字段
     */
    public function getEditable($name, $modify)
    {
        $filed = [];
        $table = TableFront::getInstance()->getTable($name);
        foreach ($table as $v) {
            if (isset($v['modify'])) {
                $edit = explode('|', $v['modify']);
                if (in_array($modify, $edit)) {
                    $filed[] = $v;
                }
            }
        }
        return $filed;
    }

    /**
     * @param $name
     * @return mixed
     * 原点 2022年8月3日11:22:01 设置额外查询条件
     */
    public function setExtraMap($data, $name = '')
    {
        Cache::set(TableTool::getName($name, 'extraMap'), $data);
        return $this;
    }

    /**
     * @param $name
     * @return mixed
     * 原点 2022年8月3日11:22:01 获取额外查询条件
     */
    public function getExtraMap($name = '')
    {
        return Cache::get(TableTool::getName($name, 'extraMap'));
    }


    /**
     * @param $data - 搜索内容
     * @param $batch - 是否批量
     * @return $this
     * 原点 2022年8月3日11:20:46 设置搜索内容
     */
    public function setSearch($data, $batch = false)
    {
        if (!$batch) {
            if ($data && is_array($data)) {
                $this->search[] = $data;
            }
        } else {
            if ($data && is_array($data)) {
                foreach ($data as $v) {
                    $this->search[] = $v;
                }
            }
        }
        return $this;
    }

    /**
     * @param $name - 控制器/方法名，为空则自动获取
     * @param $cache - 是否从缓存里读取
     * @return array|mixed
     * 原点 2022年8月3日11:18:57 获取搜索内容
     */
    public function getSearch($name = '', $cache = true)
    {
        $name = TableTool::getName($name, 'table_search');
        if ($cache) {
            if (Cache::get($name)) {
                return Cache::get($name);
            } else {
                Cache::set($name, $this->search);
                return $this->search;
            }
        } else {
            return $this->search;
        }
    }

    /**
     * @param $name
     * @return void
     * 原点 2022年11月5日13:58:48 清除搜索缓存
     */
    public function clearSearch($name = '')
    {
        Cache::delete(TableTool::getName($name, 'table_search'));
    }
}
